Alexa Skills Kit SDK for Node.jsを使ってスキルの永続アトリビュートをAmazon S3に保存する
English version of this post can be found here.
はじめに
Alexaスキルでデータ(アトリビュート)の永続化を行いたい場合、Alexa Skills Kit(ASK) SDKが提供するAttributesManagerというAPIを使うと、永続アトリビュートの保存と取得を簡単に行うことができます。 永続化レイヤーにはデフォルトでAmazon DynamoDBが使用されるようになっていますが、PersistenceAdapterというAPIを使用するとDynamoDB以外の任意のデータ永続化サービスを接続することもできます。
この記事では、Node.js版ASK SDKを使って実装した簡単なスキルを例として、ASK SDKに含まれているAmazon S3を永続化サービスとして使えるPersistenceAdapter(S3PersistenceAdapter)の使い方を紹介します。
動作確認用スキルの概要
S3PersistenceAdapterの動作確認用のサンプルとして、カフェの注文を受け付けを模擬したダミーのスキルを作成しました。永続アトリビュートの機能を活用して、前回注文したメニューについては「いつもの」と言うだけで注文できるようになっています。
一度目のスキル起動では、普通にオーダーを受け付けます。
ユーザー:「アレクサ、サンプルカフェをひらいて」 アレクサ:「いらっしゃいませ。ご注文はどうしますか?コーヒー、紅茶、緑茶、コーラがありますよ」 ユーザー:「コーヒー」 アレクサ:「コーヒーですね。すぐお作りします!」
二度目のスキル起動からは、「いつもの」と言うだけで前回受け付けたメニューを注文できます。
ユーザー:「アレクサ、サンプルカフェをひらいて」 アレクサ:「いらっしゃいませ。ご注文はどうしますか?コーヒー、紅茶、緑茶、コーラがありますよ」 ユーザー:「いつもの」 アレクサ」「わかりました。いつものコーヒーをお作りしますね!」
一度も注文したことがない状態で「いつもの」と、言われたら、注文を促すように話しかけます。
ユーザー:「アレクサ、サンプルカフェをひらいて」 アレクサ:「いらっしゃいませ。ご注文はどうしますか?コーヒー、紅茶、緑茶、コーラがありますよ」 ユーザー:「いつもの」 アレクサ:「ご来店ははじめてのようですね!ご注文はどうしますか?コーヒー、紅茶、緑茶、コーラがありますよ」
S3PersistenceAdapterを使うスキルを開発するまえに必要な準備
- ask-sdk-s3-persistence-adapterのインストール
- ASK SDK for Node.jsをインストールするとDynamoDBのPersistenceAdapterは一緒にインストールされますが、S3のPersistenceAdapterは含まれないので別途インストールが必要です。
- 永続アトリビュートを保存するためのS3バケットの作成
- DynamoDBを使う場合は、スキルの実行時にテーブルを作成する
withAutoCreateTable
ヘルパー関数を利用できますが、S3を使う場合には事前にバケットを作成しておかないとエラーになります。
- DynamoDBを使う場合は、スキルの実行時にテーブルを作成する
- LambdaからS3バケットへアクセスするためのIAMロールの設定
- Lambdaに設定したIAMロールにS3へのアクセス権限を追加していない場合もエラーになります。
S3PersistenceAdapterの使い方
GitHubで公開したサンプルスキルのプロジェクトから、Amazon S3を永続化レイヤーに指定して永続アトリビュートの読み書きを行う部分を抜粋します。
S3PersistenceAdapterモジュールの読み込み
import * as Adapter from 'ask-sdk-s3-persistence-adapter';
S3PersistenceAdapterオブジェクトの生成とSkillBuilderオブジェクトの設定
// S3PersistenceAdapterオブジェクトの生成 const S3BUCKET_NAME = process.env['S3BUCKET_NAME'] as string; const config = { bucketName: S3BUCKET_NAME }; const S3Adapter = new Adapter.S3PersistenceAdapter(config); // Lambda関数のメイン処理 exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( LaunchRequestHandler, OrderIntentHandler, RegularOrderIntentHandler ) .addErrorHandlers(ErrorHandler) .withPersistenceAdapter(S3Adapter) // SkillBuilderにS3PersistenceAdapterを設定する .lambda();
永続アトリビュートの取得と保存
const {attributesManager} = handlerInput; // 永続アトリビュートオブジェクトの取得 const attributes = await attributesManager.getPersistentAttributes(); // 永続アトリビュートオブジェクトへの値のセット attributes.drink = drink; attributesManager.setPersistentAttributes(attributes); // 永続アトリビュートオブジェクトの保存 await attributesManager.savePersistentAttributes();
S3に保存された永続アトリビュートの実体の確認
S3に保存された永続アトリビュートの実体を確認するために、実際にスキルを動作させてみます。初回の起動で「いつもの」と言っても、永続アトリビュートがまだ保存されていないため通常の注文を受けるフローが実行されます。
一度注文を行ったあとにLambdaで指定したS3バケットを開くと、以下のようにユーザーID単位でファイル(オブジェクト)が作成されます。
このファイルの中身はJSON形式のテキストファイルで、以下のように注文内容が保存されています。
もう一度、スキルを起動して「いつもの」というと、永続アトリビュートが参照されるようになります。
補足
- S3PersistenceAdapterをnewする時の引数configにObjectKeyGeneratorを指定すると、userId以外をキーにできます。SDKにはdeviceIdをキーにするObjectKeyGeneratorの実装が含まれてるので、自前で独自のキーを扱うObjedtKeyGeneratorを実装する時の参考になるでしょう
- Amazon S3はDynamoDBとは異なるの整合性モデルで動作します。永続アトリビュートにリアルタイムな整合性が必要な場合はDynamoDBを使うべきです
おわりに
ASK SDKに用意されているAttributesManager APIを使うとAlexaスキルの永続アトリビュートの保存と取得を簡単に行うことができます。PersistenceAdapter APIを使えば永続化サービスをデフォルトのDynamoDBからAmazon S3など別の永続化サービスにも簡単に切り替えることができました。
最後まで読んでいただきありがとうございました。参考になるところがありましたら、SNSでシェアしていただけると嬉しいです。コメントもお待ちしています!